home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / powervww / pvcalend.cpp < prev    next >
C/C++ Source or Header  |  1998-01-05  |  5KB  |  223 lines

  1. //  ____________________________________________________
  2. // |                                                    |
  3. // |  Project:     POWER VIEW INTERFACE                 |
  4. // |  File:        PVCALEND.CPP                         |
  5. // |  Compiler:    WPP386 (10.6)                        |
  6. // |                                                    |
  7. // |  Subject:     Automatic calendar implementation    |
  8. // |                                                    |
  9. // |  Author:      Emil Dotchevski                      |
  10. // |____________________________________________________|
  11. //
  12. // E-mail: zajo@geocities.com
  13. // URL:    http://www.geocities.com/SiliconValley/Bay/3577
  14.  
  15. #define uses_calend
  16. #define uses_dc
  17. #define uses_desk
  18. #define uses_dialog
  19. #define uses_icons
  20. #define uses_input
  21. #define uses_stddlg
  22. #define uses_system
  23.  
  24. #include "PVuses.h"
  25.  
  26. class Tcalendar: public Titem
  27. {
  28.   public:
  29.     uint year;
  30.     uint month;
  31.     uint days;
  32.     uint cur_year;
  33.     uint cur_month;
  34.     uint cur_day;
  35.     Tcalendar( void );
  36.     virtual void draw( void );
  37.     virtual void event_handler( Tevent &ev );
  38. };
  39.  
  40. class Tcalendar_window: public Twindow
  41. {
  42.   public:
  43.     Tcalendar_window( void );
  44.     virtual ~Tcalendar_window( void );
  45. };
  46.  
  47. static Tcalendar_window *calendar_window = NULL;
  48.  
  49. //TCALENDAR
  50.  
  51. Tcalendar::Tcalendar( void ):
  52.   Titem( 20, 7 )
  53. {
  54.   Ticon *i;
  55.   dosdate_t date;
  56.  
  57.   _dos_getdate( &date );
  58.   cur_year = date.year;
  59.   cur_month = date.month;
  60.   cur_day = date.day;
  61.   year = cur_year;
  62.   month = cur_month;
  63.   i = NEW( Ticon( i_sb_up, cmUP_ARROW, kUP ) );
  64.     i->set_flags( bfREPEAT, 1);
  65.     put_in( i, 16, 0 );
  66.   i = NEW( Ticon( i_sb_down, cmDOWN_ARROW, kDOWN ) );
  67.     i->set_flags( bfREPEAT, 1);
  68.     put_in( i,18,0 );
  69. }
  70.  
  71. static int day_of_week( int day, int month, int year )
  72. {
  73.   int century, yr, dw;
  74.  
  75.   if( month >= 3 )
  76.     month -= 2;
  77.   else
  78.   {
  79.     month += 10;
  80.     year--;
  81.   }
  82.   century = year / 100;
  83.   yr = year % 100;
  84.   dw = ( ( ( 26 * month - 2 ) / 10 ) + day + yr + ( yr >> 2 ) +
  85.     ( century >> 2 ) - ( 2 * century ) ) % 7;
  86.   if( dw < 0 ) return dw + 7;
  87.   return dw;
  88. }
  89.  
  90. static char days_in_month( char month, uint year )
  91. {
  92.   static char d_in_m[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  93.   return d_in_m[month-1] + (char) ( !( year & 3 ) && ( month == 2 ) );
  94. }
  95.  
  96. void Tcalendar::draw( void )
  97. {
  98.   int i, j, cur_days, overflow, xx;
  99.   char c;
  100.  
  101.   days = days_in_month( month, year );
  102. #ifdef CYR
  103.   txtf( "|b%-9s|t %d|n Å  é  æ  ù  Å |d æ  ì", months[month-1], year );
  104. #else
  105.   txtf( "|b%-9s|t %d|n|dSu|t Mo Tu We Th Fr |dSa", months[month-1], year );
  106. #endif
  107. #ifdef CYR
  108.   cur_days = 1 - ( ( day_of_week( 1, month, year ) + 6 ) % 7 );
  109. #else
  110.   cur_days = 1 - day_of_week( 1, month, year );
  111. #endif
  112.   overflow = cur_days + 35;
  113.   for( i = 0; i < 5; i++ )
  114.   {
  115.     txt( "|n" );
  116.     for( j = 0; j < 7; j++, cur_days++, overflow++ )
  117.     {
  118.       if( overflow > days ) xx = cur_days; else xx = overflow;
  119.       if( ( xx < 1 ) || ( xx > days ) )
  120.         direct_txt( "   " );
  121.       else
  122.       {
  123.         c = 't';
  124. #ifdef CYR
  125.         if( j >= 5 ) c = 'd';
  126. #else
  127.         if( ( j == 0 ) || ( j == 6 ) ) c = 'd';
  128. #endif
  129.         if( ( year == cur_year ) && ( month == cur_month ) && ( xx == cur_day ) ) c = 'b';
  130.         txtf( "|%c%2d|t ", c, xx );
  131.       }
  132.     }
  133.   }
  134. }
  135.  
  136. void Tcalendar::event_handler( Tevent &ev )
  137. {
  138.   Titem::event_handler( ev );
  139.   if( !state( isFOCUSED ) ) return;
  140.   switch( ev.code )
  141.   {
  142.     case evCOMMAND:
  143.       switch( ev.CMD_CODE )
  144.       {
  145.         case cmUP_ARROW:
  146.           month--;
  147.           if( month < 1 )
  148.           {
  149.             year--;
  150.             month = 12;
  151.           }
  152.           break;
  153.         case cmDOWN_ARROW:
  154.           month++;
  155.           if( month > 12 )
  156.           {
  157.             year++;
  158.             month = 1;
  159.           }
  160.           break;
  161.         default:
  162.           return;
  163.       }
  164.       break;
  165.     case evKEY_PRESS:
  166.       switch( ev.ASCII )
  167.       {
  168.         case kESC:
  169.           put_command( owner, cmDONE );
  170.           break;
  171.         case kENTER:
  172.           year = cur_year;
  173.           month = cur_month;
  174.           break;
  175.         default:
  176.           return;
  177.       }
  178.       break;
  179.     default:
  180.       return;
  181.   }
  182.   handled( ev );
  183.   redraw();
  184. }
  185.  
  186. //TCALENDAR_WINDOW
  187.  
  188. Tcalendar_window::Tcalendar_window( void ):
  189. #ifdef CYR
  190.   Twindow( "èá½Ñ¡ñá░", 24, 10 )
  191. #else
  192.   Twindow( "Calendar", 24, 10 )
  193. #endif
  194. {
  195.   set_flags( ifRESIZEABLE+ifTILEABLE, 0 );
  196.   set_state( isON_TOP, 1 );
  197.   palette = wpTOOL;
  198.   grow_mode = gmDONT_GROW;
  199.   commands<<cmUP_ARROW<<cmDOWN_ARROW;
  200.   put_in( (Titem *)NEW( Tcalendar ), 2, 2 );
  201. }
  202.  
  203. Tcalendar_window::~Tcalendar_window( void )
  204. {
  205.   calendar_window = NULL;
  206. }
  207.  
  208.  
  209. void calendar( void )
  210. {
  211.   if( calendar_window != NULL )
  212.   {
  213.     calendar_window->focus();
  214.     message( calendar_window, cmWIN_RESTORE );
  215.   }
  216.   else
  217.   {
  218.     _context( cxCALENDAR );
  219.     calendar_window = NEW( Tcalendar_window );
  220.     desktop->put_in( calendar_window, xCENTER, yCENTER );
  221.   }
  222. }
  223.